'use strict';

const childProcess = require('child_process');

module.exports = class Util {

    static isValidIPv4(str) {
        const blocks = str.split('.');
        if (blocks.length !== 4) return false;

        for (let value of blocks) {
            value = parseInt(value, 10);
            if (Number.isNaN(value)) return false;
            if (value < 0 || value > 255) return false;
        }

        return true;
    }

    static promisify(fn) {
        // eslint-disable-next-line func-names
        return function (req, res) {
            Promise.resolve().then(async () => fn(req, res))
                .then(result => {
                    if (res.headersSent) return;

                    if (typeof result === 'undefined') {
                        return res
                            .status(204)
                            .end();
                    }

                    return res
                        .status(200)
                        .json(result);
                })
                .catch(error => {
                    if (typeof error === 'string') {
                        error = new Error(error);
                    }

                    // eslint-disable-next-line no-console
                    console.error(error);

                    return res
                        .status(error.statusCode || 500)
                        .json({
                            error: error.message || error.toString(),
                            stack: error.stack,
                        });
                });
        };
    }

    static async exec(cmd, {
        log = true,
    } = {}) {
        if (typeof log === 'string') {
            // eslint-disable-next-line no-console
            console.log(`$ ${log}`);
        } else if (log === true) {
            // eslint-disable-next-line no-console
            console.log(`$ ${cmd}`);
        }

        if (process.platform !== 'linux') {
            return '';
        }

        return new Promise((resolve, reject) => {
            childProcess.exec(cmd, {
                shell: 'bash',
            }, (err, stdout) => {
                if (err) return reject(err);
                return resolve(String(stdout).trim());
            });
        });
    }

};
